package com.qf.user.service.impl;

import com.qf.user.dao.UserDao;
import com.qf.user.dao.UserMapper;
import com.qf.user.model.User;
import com.qf.user.model.UserExample;
import com.qf.user.service.UserService;
import com.qf.user.settings.Settings;
import com.qf.util.PatternUtil;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 用户服务的实现类
 * @version v1.0.0
 * @Description:
 * @author: 姜红凯
 * @date: 2022.04.01
 * @since 1.0
 */
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;

    @Resource
    private UserMapper userMapper;

    @Resource
    private Settings settings;

    @Override
    public User isLocked(String signInName) {
        //用正则判断它是否是手机号
        boolean isMobile= PatternUtil.isMobile(signInName);
        UserExample example=new UserExample();
        UserExample.Criteria criteria = example.createCriteria();
        if(isMobile){
            //根据手机号查询
            criteria.andTelephoneEqualTo(signInName);
        }else{
            //如果不是，用正则判断它是否是邮箱
            boolean isEmail= PatternUtil.isEmail(signInName);
            if(isEmail){
                //根据邮箱查询
                criteria.andEmailEqualTo(signInName);
            }else{
                //如果不是，那么它一定是用户名
                //根据用户名查询
                criteria.andUsernameEqualTo(signInName);
            }
        }
        //条件合理了。
        List<User> users=userDao.selectByExample(example);
        //这个判断以后会非常常用
        if (users!=null&&users.size()>0){
            //查询到数据了
            User user=users.get(0);
            Date lockedTime = user.getLockedTime();
            //lockedTime是不是今天
            //如果是今天，那么就是被锁定了
            SimpleDateFormat simpleDateFormat=new SimpleDateFormat();
            simpleDateFormat.applyPattern("yyyyMMdd");
            if(lockedTime!=null){
                String dbDay=simpleDateFormat.format(lockedTime);
                //取当前时间
                String nowDay = simpleDateFormat.format(new Date());
                if(!dbDay.equals(nowDay)){
                    //如果不是今天，现在把user的锁定状态置为0，尝试错误次数也置为0
                    user.setIsLocked(0);
                    user.setTryCount(0);
                }
                //更新数据库
                //入参为一个实体类的对象，根据主键对表进行更新
                //user依据id作为where更新user表
                //当user中的字段为null时，就不拼入sql语句中
                userDao.updateByPrimaryKeySelective(user);
                //当user中的字段为null时，就往数据库表中写入对应的字段为null。
                //userDao.updateByPrimaryKey(user);
            }else{
                //说明新用户从来没锁过
                //设置初始的数据
                user.setIsLocked(0);
                user.setTryCount(0);
                userDao.updateByPrimaryKeySelective(user);
            }
            return user;
        }else{
            return null;
        }
    }

    @Override
    public User signIn(String signInName, String password) {
        //根据登录名拿到用户
        User user=isLocked(signInName);
        if(user==null){
            //登录信息有误
            return null;
        }
        if(user.getIsLocked()==1){
            //被锁定了
            return null;
        }
        if(password.equals(user.getPassword())){
            //密码相同
            //登录成功
            return user;
        }else{
            //密码错误
            if(user.getLockedTime()==null){
                //这个用户从来没有输错过密码
                //这是他第一次输错。
                user.setLockedTime(new Date());
                user.setTryCount(1);
                userDao.updateByPrimaryKeySelective(user);
                return null;
            }
            //尝试错误次数，锁定时间
            SimpleDateFormat simpleDateFormat=new SimpleDateFormat();
            simpleDateFormat.applyPattern("yyyyMMdd");
            //取数据库里的一天
            String dbDay = simpleDateFormat.format(user.getLockedTime());
            //取当前日期
            String nowDay = simpleDateFormat.format(new Date());
            if(dbDay.equals(nowDay)) {
                //累计次数
                user.setTryCount(user.getTryCount() + 1);
                Integer count = Integer.parseInt(settings.get(Settings.SIGNIN_ERROR_MAX_COUNT));
                if(count.equals(user.getTryCount())){
                    //设置为锁定状态
                    user.setIsLocked(1);
                }
            }else{
                //清空从1开始，重新记录
                user.setLockedTime(new Date());
                user.setTryCount(1);
            }
        }
        //更新数据库
        userDao.updateByPrimaryKeySelective(user);
        return null;
    }

    /**
     * 讲解插件的使用方法
     */
    private void test() {
        //userDao的使用
        //在一组数据中，查找符合规定的元素，使用“例子对象”进行过滤。
        //一个例子对象里应该包含多个条件。

        //塑料模特：例子对象
        UserExample example = new UserExample();
        //拿到条件对象
        UserExample.Criteria criteria = example.createCriteria();
        criteria.andTelephoneEqualTo("15911135712");
        criteria.andUsernameEqualTo("zhangsan");

        //根据例子查找数据
        List<User> users = userDao.selectByExample(example);
    }

    @Override
    public User oneKeySignIn(String phone) {
        //查手机号
        UserExample example=new UserExample();
        UserExample.Criteria criteria=example.createCriteria();
        criteria.andTelephoneEqualTo(phone);
        List<User> users = userDao.selectByExample(example);
        if (users!=null&&users.size()>0){
            //查到了
            return users.get(0);
        }else {
            //查不到，构建一个用户返回
            User user=new User();
            //设置信息
            user.setTelephone(phone);
            //设置随机昵称
            user.setNickname(userMapper.randomNickName());
            //插入数据库
            userDao.insertSelective(user);
            //查出来
            users=userDao.selectByExample(example);
            //返回
            return users.get(0);
        }
    }
}
